﻿#define _CRT_SECURE_NO_WARNINGS
//int int_cmp(const void* p1, const void* p2) {
//	return (*(int*)p1 - *(int*)p2);
//}
//void _swap(void* p1, void* p2,int size) {
//	int i = 0;
//	for (i = 0; i < size; i++) {
//		char tmp = *((char*)p1 + i);
//		*((char *)p1+i)= *((char*)p2 + i);
//		*((char*)p2 + i)= tmp;
//	}
//}
//void bubble(void* base, int count, int size, int(*cmp)(void*, void*)) {
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < count - 1; i++) {
//		for (j = 0; j < count - i - 1; j++) {
//			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0) {
//				_swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
//			}
//		}
//	}
//}
//#include <stdio.h>
//int main() {
//	int arr[] = { 1,3,5,7,9,2,4,6,8,0 };
//	int i = 0;
//	bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
//	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	unsigned char a = 200;
//	unsigned char b = 100;
//	unsigned char c = 0;
//	c = a + b;
//	printf("%d %d", a + b, c);
//	return 0;
//}
//
//int main()
//{
//	char a[1000] = { 0 };
//	int i = 0;
//	for (i = 0; i < 1000; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d", strlen(a));
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//    int a = 0x11223344;
//    char* pc = (char*)&a;
//    *pc = 0;
//    printf("%x\n", a);
//    return 0;
//}

//#include <stdio.h>
//#include <assert.h>
////int my_strlen(const char* str) {
////	assert(str);
////	int count = 0;
////	while (*str) {
////		count++;
////		str++;
////	}
////	return count;
////}
////int my_strlen(const char* str) {
////	assert(str);
////	if (*str == '\0') {
////		return 0;
////	}
////	else {
////		return 1 + my_strlen(str + 1);
////	}
////}
//int my_strlen(char* s) {
//	assert(s);
//	char* p = s;
//	while (*s) {
//		s++;
//	}
//	return s - p;
//}
//int main() {
//	char arr[] = "abcdefg";
//	int ret = my_strlen(arr);
//	printf("%d ", ret);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main() {
//	char arr1[20] = { 0 };
//	char arr2[] = "hello";
//	strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char* my_strcpy(char* dest, const char* src) {
//	char* ret = dest;
//	assert(dest != NULL);
//	assert(src != NULL);
//	while ((*dest++ = *src++)) {
//		;
//	}
//	return ret;
//}
//int main() {
//	char arr1[20] = { 0 };
//	char arr2[] = "hello";
//	my_strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char* my_strcat(char* dest, const char* src) {
//	char* ret = dest;
//	assert(dest != NULL);
//	assert(src != NULL);
//	while (*dest) {
//		dest++;
//	}
//	while ((*dest++ = *src++)) {
//		;
//	}
//	return ret;
//}
//int main() {
//	char arr1[20] = "abcdef";
//	char arr2[] = "hello";
//	my_strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//int my_strcmp(const char* str1, const char* str2) {
//	int ret = 0;
//	assert(str1 != NULL);
//	assert(str2!= NULL);
//	while(*str1 == *str2) {
//		if (*str1 == '\0')
//			return 0;
//		str1++;
//		str2++;
//	}
//	return *str1 - *str2;
//}
//int main() {
//	char arr1[20] = "abcd";
//	char arr2[] = "abcde";
//	int ret =my_strcmp(arr1, arr2);
//	printf("%d\n", ret);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char * my_strstr(const char* str1,const char* str2) {
//	const char* cp = str1;
//	const char* s1, * s2;
//	if (*str2 == '\0') {
//		return (char*)str1;
//	}
//	while (*cp) {
//		s1 = cp;
//		s2 = str2;
//		while (*s1 && *s2 && *s1 == *s2) {
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0') {
//			return (char*)cp;
//		}
//		cp++;
//	}
//	return (NULL);
//}
//int main() {
//	char str1[] = "abbbcdefg";
//	char str2[] = "bbc";
//	char* ret=my_strstr(str1, str2);
//	if (ret != NULL) {
//		printf("%s\n", ret);
//	}
//	else {
//		printf("找不到\n");
//	}
//	return 0;
//}

//#include <stdio.h>
//int check_sys() {
//	int i = 1;
//	return (*(char*)&i);
//}
//int main() {
//	int ret = check_sys();
//	printf("%d", ret);
//	return 0;
//}

//#include <stdio.h>
//
//#include <string.h>
//
//#include <assert.h>
//
//char* my_strncpy(char* dest, const char* src,size_t num) {
//
//	char* ret = dest;
//
//	size_t i = 0;
//
//	assert(dest != NULL);
//
//	assert(src != NULL);
//
//	while (*src &&  i<num) {
//		*ret++ = *src++;
//		i++;
//
//	}
//	for (int j = i; j < num; j++) {
//		*ret++ = 0;
//	}
//
//	return dest;
//
//}
//
//int main() {
//
//	char arr1[20] = "abcdefg";
//
//	char arr2[] = "hello";
//
//	size_t num = 3;
//
//	my_strncpy(arr1, arr2,num);
//
//	printf("%s\n", arr1);
//
//	return 0;
//
//}

//#include <stdio.h>
//
//#include <string.h>
//
//#include <assert.h>
//
//char* my_strcpy(char* dest, const char* src, size_t num) {
//
//    char* ret = dest;
//
//    size_t i = 0;
//
//    assert(dest != NULL);
//
//    assert(src != NULL);
//
//    while (((*dest++ = *src++) && (i < num-1))) {
//
//        i++;
//
//    }
//
//    return ret;
//
//}
//
//int main() {
//
//    char arr1[20] = { 0 };
//
//    char arr2[] = "hello";
//
//    size_t num = 3;
//
//    my_strcpy(arr1, arr2, num);
//
//    printf("%s\n", arr1);
//
//    return 0;
//
//}

//#include <stdio.h>
//int main() {
//	int a = 10;
//	&a;
//	printf("%d\n", a);
//	printf("%p\n", &a);
//	return 0;
//}

//#include <stdio.h>
//struct stu
//{
//	int num;
//	char name[10];
//	int age;
//};
//
//void fun(struct stu* p)
//{
//	printf("%s\n", (*p).name);
//	return;
//}
//
//int main()
//{
//	struct stu students[3] = { {9801,"zhang",20},
//							 {9802,"wang",19},
//							 {9803,"zhao",18} };
//	fun(students + 1);
//	return 0;
//}

////代码1
//#include <stdio.h>
//int main()
//{
//	int n = 0x11223344;
//	int* pi = &n;
//	*pi = 0;
//	printf("%d\n", n);
//	return 0;
//}

////代码2
//#include <stdio.h>
//int main()
//{
//	int n = 0x11223344;
//	char* pc = (char*)&n;
//	*pc = 0;
//	printf("%d\n", n);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int n = 10;
//	char* pc = (char*)&n;
//	int* pi = &n;
//	printf("&n=%p\n", &n);
//	printf("pc=%p\n", pc);
//	printf("pc+1=%p\n", pc + 1);
//	printf("pi=%p\n", pi);
//	printf("pi+1=%p\n", pi + 1);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10;
//	int* pa = &a;
//	char* pc = &a;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10;
//	void* pa = &a;
//	void* pc = &a;
//	*pa = 10;
//	*pc = 0;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int m = 0;
//	m = 20; //m是可以修改的
//	const int n = 0;
//	n = 20; //n是不能被修改的
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	const int n = 0;
//	printf("n = %d\n", n);
//	int* p = &n;
//	*p = 20;
//	printf("n = %d\n", n);
//	return 0;
//}

//#include <stdio.h>
////代码1
//void test1()
//{
//	int n = 10;
//	int m = 20;
//	int* p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//void test2()
//{
//	//代码2
//	int n = 10;
//	int m = 20;
//	const int* p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//void test3()
//{
//	int n = 10;
//	int m = 20;
//	int* const p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//void test4()
//{
//	int n = 10;
//	int m = 20;
//	int const* const p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//int main()
//{
//	//测试⽆const修饰的情况
//	test1();
//	//测试const放在*的左边情况
//	test2();
//	//测试const放在*的右边情况
//	test3();
//	//测试*的左右两边都有const
//	test4();
//	return 0;
//}

//#include <stdio.h>
////指针+- 整数
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p + i)); //p+i 这⾥就是指针+整数  *(p+i)等价于p[i]
//	}
//	return 0;
//}

////指针-指针
//#include <stdio.h>
//int my_strlen(char* s)
//{
//	char* p = s;
//	while (*p != '\0')
//		p++;
//	return p - s;
//}
//int main()
//{
//	printf("%d\n", my_strlen("abc"));
//	return 0;
//}

////指针的关系运算
//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	while (p < arr + sz) //指针的⼤⼩⽐较
//	{
//		printf("%d ", *p);
//		p++;
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int* p; //局部变量指针未初始化，默认为随机值
//	*p = 20;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//	int* p = &arr[0];
//	int i = 0;
//	for (i = 0; i <= 11; i++)
//	{
//		//当指针指向的范围超出数组arr的范围时，p就是野指针
//		*(p++) = i;
//	}
//	return 0;
//}

//#include <stdio.h>
//int* test()
//{
//	int n = 100;
//	return &n;
//}
//int main()
//{
//	int* p = test();
//	printf("%d\n", *p);
//	return 0;
//}

//#include <stdio.h>
//#include <ctype.h>
//int main() {
//	int i = 0;
//	char str[] = "Test String.\n";
//	char c;
//	while (str[i]) {
//		c = str[i];
//		if (islower(c)) {
//			c=toupper(c);
//			putchar(c);//输出一个字符
//			i++;
//		}
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main() {
//	const char* str1 = "abcdef";
//	const char* str2 = "bbb";
//	if (strlen(str2) - strlen(str1) > 0) {
//		printf("str2>str1\n");
//	}
//	else {
//		printf("str1>str2\n");
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <assert.h>
//int my_strlen(char *arr) {
//	assert(arr);
//	char* p = arr;
//	while (*p != '\0') {
//		p++;
//	}
//	return p - arr;
//}
//int main() {
//	char arr[] = "abcdefg";
//	int ret = my_strlen(arr);
//	printf("%d ", ret);
//	return 0;
//}

//#include <stdio.h>
//typedef struct s{
//	int a;
//	char b;
//	short c;
//	short d;
//}AA_t;
//int main() {
//	printf("%d\n", sizeof(struct s));
//	return 0;
//}

//#include <stdio.h>
//#pragma pack(4)/*编译选项，表示4字节对齐 平台：VS2013。语言：C语言*/
////假设long 是4个字节
//int main(int argc, char* argv[])
//{
//    struct tagTest1
//    {
//        short a;
//        char d;
//        long b;
//        long c;
//    };
//    struct tagTest2
//    {
//        long b;
//        short c;
//        char d;
//        long a;
//    };
//    struct tagTest3
//    {
//        short c;
//        long b;
//        char d;
//        long a;
//    };
//    struct tagTest1 stT1;
//    struct tagTest2 stT2;
//    struct tagTest3 stT3;
//
//    printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));
//    return 0;
//}
//#pragma pack()

//#include<stdio.h>
//int main()
//{
//    union
//    {
//        short k;
//        char i[2];
//    }*s, a;
//    s = &a;
//    s->i[0] = 0x39;
//    s->i[1] = 0x38;
//    printf("%x\n", a.k);
//    return 0;
//}

//#include <stdio.h>
//int main() {
//	enum ENUM_A
//	{
//		X1,
//		Y1,
//		Z1 = 255,
//		A1,
//		B1,
//	};
//	enum ENUM_A enumA = Y1;
//	enum ENUM_A enumB = B1;
//	printf("%d %d\n", enumA, enumB);
//}

//#include <stdio.h>
//int main()
//{
//    unsigned char puc[4];
//    struct tagPIM
//    {
//        unsigned char ucPim1;
//        unsigned char ucData0 : 1;
//        unsigned char ucData1 : 2;
//        unsigned char ucData2 : 3;
//    }*pstPimData;
//    pstPimData = (struct tagPIM*)puc;
//    memset(puc, 0, 4);
//    pstPimData->ucPim1 = 2;
//    pstPimData->ucData0 = 3;
//    pstPimData->ucData1 = 4;
//    pstPimData->ucData2 = 5;
//    printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);
//    return 0;
//}

//#include <stdio.h>
//#pragma pack(4)
//int main() {
//	struct A
//	{
//		int a;
//		short b;
//		int c;
//		char d;
//	};
//
//	struct B
//	{
//		int a;
//		short b;
//		char c;
//		int d;
//	};
//	printf("%d\n", sizeof(struct A));
//	printf("%d\n", sizeof(struct B));
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main() {
//	char arr1[20] = { 0 };
//	char arr2[] = "hello every one";
//	strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

//#include <stdio.h>
//#include <assert.h>
//char* my_strcpy(char* dest, const char* src) {
//	char* ret = dest;
//	assert(dest && src);
//	while ((*dest++ = *src++)) {
//		;
//	}
//	return ret;
//}
//int main() {
//	char arr1[20] = { 0 };
//	char arr2[] = "hello every one";
//	my_strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

//#include <stdio.h>
//#include <assert.h>
//char* my_strcat(char* dest, const char* src) {
//	char* ret = dest;
//	assert(dest && src);
//	while (*dest) {
//		dest++;
//	}
//	while ((*dest++ = *src++)) {
//		;
//	}
//	return ret;
//}
//int main() {
//	char arr1[30] = "abcd\0efg";
//	char arr2[] = "hello";
//	my_strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2);
	while (*str1 == *str2) {
		if (str1 == '\0') {
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main() {
	char arr1[] = "abcdef";
	char arr2[] = "abcdg";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0) {
		printf("arr1>arr2\n");
	}
	else if (ret < 0) {
		printf("arr1<arr2\n");
	}
	else {
		printf("arr1=arr2\n");
	}
	return 0;
}